package com.kolon.framework.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.springframework.web.multipart.MultipartFile;

import com.kolon.framework.file.iface.FileRenamePolicy;


/**
 *	파일 유틸 클래스
 *	@author Stone
 *	@since 2011.08.09
 */
public class FileUtil {

	/**
	 * 파일 및 디렉토리을 삭제한다.
	 */
	public static void delFile(String path) {
		try {
			File delFile = new File(path);
			if (delFile.isFile()) {
				delFile.delete();
			}
		} catch (Exception e) { }
	}
	
	/**
	 * 디렉토리 생성
	 * @param path 디렉토리 PATH
	 */
	public static void makeBasePath(String path) {
		File dir = new File(path);
		if (!dir.exists()) dir.mkdirs();
	}
	
	/**
	 * 파일 확장자를 얻는 함수
	 * @param fileName
	 * @return
	 */
	public static String getExtension(String fileName) {
		if (fileName == null) return "";
		int dot = fileName.lastIndexOf(".");
		if (dot != -1 && fileName.length() > dot + 1) {
			return fileName.substring(dot+1);
		} else {
			return "";
		}
	}

	/**
	 * 파일 명만 얻는 함수
	 * @param fileName	- 파일 명
	 * @return
	 */
	public static String getFileName(String fileName) {
		if (fileName == null) return "";
		int dot = fileName.lastIndexOf(".");
		if (dot != -1 && fileName.length() > dot + 1) {
			return fileName.substring(0, dot);
		} else {
			return "";
		}
	}
	
	/**
	 * 파일 업로드
	 * @param file	- MultipartFile 객체
	 * @param savePath	- 저장 디렉토리 경로
	 * @param policy	- 파일명 중복시 변경 클래스
	 * @return
	 * @throws Exception
	 */
	public static UploadedFile fileUpload(MultipartFile file, String savePath, 
			FileRenamePolicy policy) throws Exception {
		FileUpload fileUpload = new FileUpload(file ,savePath, policy);
		return fileUpload.getUploadedFile();
	}

	/**
	 * 파일 복사
	 * @param fileInputPath - 복사 파일
	 * @param ouputPath - 저장될 디렉토리
	 * @param fileName - 저장될 파일
	 */
	public static void fileCopy(String fileInputPath, String outputPath, String fileName) {
		if (fileInputPath != null && outputPath != null && fileName != null) {
			makeBasePath(outputPath);
			try { 
				int j = 0;
				FileInputStream fis = new FileInputStream(fileInputPath);
				FileOutputStream fos = new FileOutputStream(outputPath + fileName);
				while ((j=fis.read()) != -1) {
					fos.write(j);
				}
				fis.close();
				fos.close();
			} catch (Exception e) {
			}
		}
	}
	
	/**
	 * 디렉토리 삭제 (디렉토리 안의 파일 모두)
	 * @param targetDir	- 삭제할 디렉토리
	 */
	public static void dirDelete(File targetDir) {
		File[] childFile = targetDir.listFiles();
		if (childFile != null) {
			int size = childFile.length;
			if (size > 0) {
				for (int i=0; i < size; i++) {
					if (childFile[i].isFile()) {
						childFile[i].delete();
					} else {
						dirDelete(childFile[i]);
					}
				}
			}
			targetDir.delete();
		}
	}
}
